package cn.wzc.crystal.platform.curd;

import cn.wzc.crystal.platform.query.QueryPageResult;
import cn.wzc.crystal.platform.support.AbstractEntity;

import java.util.List;
import java.util.Map;

public interface CrudService<Dto, Entity extends AbstractEntity> {
	/**
	 * 查询数据
	 *
	 * @param page     分页
	 * @param size     页长
	 * @param criteria 查询条件
	 * @return 查询结果
	 */
	QueryPageResult<Dto> queryPage(Integer page, Integer size, Map<String, Object> criteria);

	/**
	 * 列出所有
	 *
	 * @param criteria 查询条件
	 * @return 所有数据
	 */
	List<Dto> listAll(Map<String, Object> criteria);

	/**
	 * 获取单条数据
	 *
	 * @param id 要获取的数据ID
	 * @return 查询结果
	 */

	Dto get(Long id);

	/**
	 * 保存操作
	 *
	 * @param dto 保存请求数据
	 * @return 保存结果值
	 */
	Dto save(Dto dto) throws DataNotFoundException;

	/**
	 * 保存操作
	 *
	 * @param dto 新建请求数据
	 * @return 新建数据值
	 */
	Dto create(Dto dto);

	/**
	 * 更新操作
	 *
	 * @param id  要更新的数据ID
	 * @param dto 要更新的数据
	 * @return 更新后的数据值, 如果没有更新数据, 则返回null
	 */
	Dto update(Long id, Dto dto) throws DataNotFoundException;

	/**
	 * 批量删除操作
	 *
	 * @param id 要删除的数据ID
	 */
	void deleteAll(Long... id);


	/**
	 * 单条删除操作
	 *
	 * @param id 要删除的数据ID
	 */
	void delete(Long id);

	/**
	 * 将数据传输类,转换为实体对象
	 *
	 * @param dto 数据传输类对象
	 */
	Entity toEntity(Dto dto);

	/**
	 * 将实体对象转换为数据传输对象
	 *
	 * @param entity 实体对象
	 * @return 数据传输对象
	 */
	Dto toDto(Entity entity);


}
